/*
 * Projekt: GMU 2013 - Canny hranovy detektor OpenCL/CUDA
 * Autori: Pavel Nevrala - xnevra00 (xnevra00@stud.fit.vutbr.cz)
 *         Martin Jurak - xjurak02 (xjurak02@stud.fit.vutbr.cz)
 */

#include "ImageCL.h"

/*
 * Konstruktor	
 */
ImageCL::ImageCL():image(NULL), imageData(NULL)
{
}

/*
 * Destruktor
 * Smazani obrazu
 */
ImageCL::~ImageCL()
{	
	if(imageData) 
        delete[](imageData);
	if(image) 
        delete(image);
}

/*
 * Nacteni obrazu
 * @imagePath cesta k obrazu	 
 */
void ImageCL::loadImage(const char *imagePath){
	imageData = NULL;
	image = new Mat();
	
	// nacten obrazu jako GRAYSCALE
	*image = imread(string(imagePath), CV_LOAD_IMAGE_GRAYSCALE);		
	if(!image->data) {
		throw "\nERROR: Nepodarilo se nacist obrazek!\n";		
	}

	// konvertovani do typu float
	image->convertTo(*image,TYPE);

	imageData = new cl_float[image->cols * image->rows];
	if(imageData == NULL)
	{
		throw "\nERROR: Nepodarilo se vytvorit buffer pro obrazek!\n";		
	}

	memcpy(imageData, image->data, image->cols * image->rows * sizeof(cl_float));
}

/*
 * Nacteni obrazu
 * @imgData buffer s obrazem
 * @w sirka obrazu
 * @h vyska obrazu
 */
void ImageCL::loadImage(cl_float* imgData, int w, int h){
	
	if(imageData) 
        delete[](imageData);

	if(image) 
        delete(image);

	image = new Mat(h, w, TYPE);
	imageData = new cl_float[w * h];
	memcpy(imageData, imgData, image->cols * image->rows * sizeof(cl_float));
	memcpy(image->data, imageData, image->cols * image->rows * sizeof(cl_float));
}

/*
 * Nacteni obrazu
 * @imageCV obraz v OpenCV strukture	 
 */
void ImageCL::loadImage(Mat imageCV){
	
	if(imageData) 
        delete[](imageData);

	if(image) 
        delete(image);

	image = new Mat(imageCV.rows, imageCV.cols, TYPE);
	imageData = new cl_float[imageCV.rows* imageCV.cols];
	*image = imageCV.clone();
	memcpy(imageData, imageCV.data, image->cols * image->rows * sizeof(cl_float));
	
}

/*
 * Vystup obrazu
 * @imagePath cesta k obrazu
 */
void ImageCL::writeImage(const char *imagePath)
{
	memcpy(image->data, imageData, image->cols * image->rows * sizeof(cl_float));
	
	try {
        imwrite(imagePath, *image);
    }
    catch (...) {
        throw "\nERROR: Nepodarilo se ulozit obrazek!\n";       
    }
}